package com.base.utils;

import com.alibaba.fastjson.JSON;
import com.base.utils.enums.RESULT_CODE;

/**
 * 响应结果工具类.
 *
 * @author junw
 * @date 2018/5/10
 */
public class ResultUtil {

    /**
     * 生成成功结果并绑定数据.
     *
     * @param data 绑定数据
     * @return json
     */
    private static <T> String success(String msg, T data) {
        Result result = new Result();
        result.setCode(RESULT_CODE.SUCCESS.getCode());
        result.setMsg(msg);
        result.setData(data);
        return JSON.toJSON(result).toString();
    }

    /**
     * 生成成功结果.
     *
     * @return json
     */
    public static String success(Object data) {
        return JSON.toJSON(success("", data)).toString();
    }


    /**
     * 生成成功结果.
     *
     * @return json
     */
    public static String success(String msg) {
        return JSON.toJSON(success(msg, null)).toString();
    }

    /**
     * 生成成功结果.
     *
     * @return json
     */
    public static String success() {
        return JSON.toJSON(success(RESULT_CODE.SUCCESS.getMaessage())).toString();
    }

    /**
     * 生成失败结果并绑定数据.
     *
     * @param code 错误码
     * @param msg  错误信息
     * @param data 绑定数据
     * @return json
     */
    private static <T> String error(Integer code, String msg, T data) {
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        result.setData(data);
        return JSON.toJSON(result).toString();
    }

    /**
     * 生成失败结果.
     *
     * @param code 错误码
     * @param msg  错误信息
     * @return json
     */
    public static String error(Integer code, String msg) {
        return error(code, msg, null);
    }

    public static String error(String msg) { return error(RESULT_CODE.FAIL.getCode(),msg,null); }

    /**
     * 响应结果对象
     *
     * @param <T>
     */
    public static class Result<T> {

        /**
         * 错误码
         */
        private Integer code;

        /**
         * 提示信息
         */
        private String msg;

        /**
         * 具体的内容
         */
        private T data;

        public Integer getCode() {
            return code;
        }

        private void setCode(Integer code) {
            this.code = code;
        }

        public String getMsg() {
            return msg;
        }

        private void setMsg(String msg) {
            this.msg = msg;
        }

        public T getData() {
            return data;
        }

        private void setData(T data) {
            this.data = data;
        }
    }
}
